﻿using Newtonsoft.Json;
using Sunny.UI;
using System.Collections.Generic;
using Polenter.Serialization;

namespace SmartMotion.Core
{
    /// <summary>
    /// 工站基类，子类可能有运动控制板卡类工站，四轴机械手工站，六轴机械手工站，PLC轴工站（流水线工站）
    /// 多轴运动，阻塞函数
    /// </summary>
    public abstract class StationBase
    {
        #region 常见功能

        //初始化工站
        //工站回零
        //工站复位
        //获得工站状态
        //获得工站信息
        //启动工站
        //停止工站
        //暂停工站
        //继续工站
        //设置工站速度
        //获取点位
        //运动到点位，单轴运动，多轴运动，绝对运动相对运动，多轴插补，多轴不插补

        #endregion 常见功能

        private List<AxisBase> _axises;

        protected StationBase()
        {
            _axises = new List<AxisBase>();
            AxisesID = new List<string>();
        }

        #region 属性

        public string Name { get; set; }

        [ExcludeFromSerialization]
        public List<AxisBase> Axises
        {
            get { return _axises ?? (_axises = new List<AxisBase>()); }
            set
            {
                _axises = value;
            }
        }

        /// <summary>
        /// 轴GUID，由配置文件选择绑定
        /// </summary>
        public List<string> AxisesID { get; set; }


        /// <summary>
        /// 轴GUID，由配置文件选择绑定
        /// </summary>
        public List<string> DIList { get; set; }

        public List<string> DOList { get; set; }
            

        #endregion 属性   

        #region 设置与示教

        /// <summary>
        /// 配置界面，配置参数
        /// </summary>
        /// <returns></returns>
        public abstract UIPage GetConfigPage();

        /// <summary>
        /// 调试界面,点位示教，轴回零，jog等功能
        /// </summary>
        /// <returns></returns>
        public abstract UIPage DebugPage();

        #endregion 设置与示教

        #region 气缸运动

        /// <summary>
        /// 等待数字输入
        /// </summary>
        /// <returns></returns>
        public virtual bool WaitDI()
        {
            return true;
        }

        /// <summary>
        /// 设置一个输出
        /// </summary>
        /// <returns></returns>
        public virtual bool SetDO()
        {
            return true;
        }

        public virtual bool CylinderMovement()
        {
            return true;
        }

        #endregion 气缸运动

        #region 轴运动

        /// <summary>
        /// 单轴回零，回零速度在轴参数里设置
        /// </summary>
        /// <param name="axis"></param>
        /// <returns></returns>
        public abstract bool Home(int axis);

        /// <summary>
        /// 多轴回零，回零速度在轴参数里设置
        /// </summary>
        /// <param name="axises"></param>
        /// <returns></returns>
        public abstract bool Home(int[] axises);

        /// <summary>
        /// 获取点位
        /// </summary>
        public abstract List<double> GetPoint();

        /// <summary>
        /// 多轴运动到点位
        /// </summary>
        /// <param name="axis">参与本次运动的轴</param>
        /// <param name="targetPosition">目标位置</param>
        /// <param name="speed">本次运动的速度比例</param>
        /// <param name="relMove">是否是相对运动，默认false，默认绝对运动</param>
        /// <param name="interpolation">是否走插补，默认位false，默认不走插补，因为一张卡插补系有限</param>
        /// <param name="overTime">超时时间,默认10秒</param>
        public abstract bool MovePoint(int[] axis, double[] targetPosition, double speed, bool relMove = false, bool interpolation = false, int overTime = 10000);

        //如果要加其他功能，在这里定义，如连续插补，位置比较输出等

        public bool CheckIO(IOIn io, bool waitValue)
        {
            return true;
        }

        /// <summary>
        /// 设定值
        /// </summary>
        /// <param name="SetValue"></param>
        public void SetValue(IOOut io, bool SetValue)
        {
        }

        #endregion 轴运动
    }

}